# Downgrader Docker sur un cluster Swarm

À la date de juin 2026, la procédure source signale des problèmes avec Docker 28 et 29 sous Ubuntu 24.04. L'équipe DevOps recommande alors Docker `27.5.1-0ubuntu3~24.04.2` comme version stable et compatible avec la pile utilisée. Vérifier la recommandation et la matrice de compatibilité en vigueur avant toute intervention.

> **Important :** effectuer l'opération nœud par nœud. L'installation du paquet peut redémarrer le service Docker et interrompre les conteneurs du nœud. Suivre la procédure de maintenance Swarm approuvée et vérifier la santé du cluster avant de passer au nœud suivant.

## 1. Vérifier l'état et la version actuelle

Sur le nœud concerné, relever la version de Docker et le paquet installé :

```bash
docker --version
dpkg -l 'docker.io'
```

Depuis un manager Swarm, vérifier également l'état des nœuds :

```bash
docker node ls
```

## 2. Vérifier les règles APT existantes

Examiner le fichier de pinning, s'il existe :

```bash
cat /etc/apt/preferences.d/docker-buggy-version-pin
```

Afficher les versions disponibles et leurs priorités :

```bash
sudo apt update
apt policy docker.io
apt list -a docker.io
```

Dans la sortie `apt policy` :

- `***` identifie la version actuellement installée;
- une priorité négative, par exemple `-1`, empêche l'installation de cette version;
- les priorités positives déterminent la sélection du paquet par APT.

La procédure source indique que Docker 28 et 29 sont exclus et que la branche 27 est privilégiée.

## 3. Configurer le pinning APT

Si le fichier de pinning n'est pas déjà configuré selon la politique de l'organisation, créer `/etc/apt/preferences.d/docker-buggy-version-pin` :

```bash
sudo tee /etc/apt/preferences.d/docker-buggy-version-pin <<'EOF'
# Docker 28+: risque de problemes reseau Swarm lors de redeploiements frequents
# https://github.com/moby/moby/issues/50232
# Docker 29+: problemes de compatibilite connus avec Traefik v2.10
# et risques reseau/DNS signales dans la procedure source.
# Privilegier la branche 27.x, sous reserve de compatibilite validee.
Package: docker.io
Pin: version 27.*
Pin-Priority: 1001

# Bloquer les versions signalees comme problematiques
Package: docker.io
Pin: version 28.*
Pin-Priority: -1

Package: docker.io
Pin: version 29.*
Pin-Priority: -1
EOF
```

Rafraîchir les index et vérifier le résultat :

```bash
sudo apt update
apt policy docker.io
apt list -a docker.io
```

Ne pas installer si la version candidate n'est pas celle validée pour le système.

## 4. Récupérer et vérifier le paquet cible

Si la version requise n'est pas disponible dans les sources APT configurées, récupérer le paquet depuis le cache APT de la TELEMW ou depuis une source Ubuntu approuvée.

Exemples de téléchargement fournis par la procédure source :

```bash
IP_TELEM="ADRESSE_IP_TELEMW"
curl -fL -o /tmp/docker.io_27.5.1-0ubuntu3_amd64.deb "http://${IP_TELEM}:9999/ftp.ubuntu.com/ubuntu/pool/universe/d/docker.io-app/docker.io_27.5.1-0ubuntu3_amd64.deb"
```

Ou depuis le dépôt Ubuntu indiqué dans la source :

```bash
curl -fL -o /tmp/docker.io_27.5.1-0ubuntu3_amd64.deb "http://ftp.ubuntu.com/ubuntu/pool/universe/d/docker.io-app/docker.io_27.5.1-0ubuntu3_amd64.deb"
```

**Vérifier la révision avant installation :** la version recommandée dans la source est `27.5.1-0ubuntu3~24.04.2`, alors que les noms des paquets présents dans les URL d'exemple indiquent `27.5.1-0ubuntu3`. Confirmer la version exacte, l'architecture et la provenance du fichier avant de l'installer :

```bash
dpkg-deb -f /tmp/docker.io_27.5.1-0ubuntu3_amd64.deb Version Architecture
```

Si la version ou l'architecture ne correspond pas au paquet approuvé, ne pas poursuivre avec ce fichier. Utiliser une source de confiance et vérifier l'intégrité du paquet selon les règles internes.

## 5. Installer le downgrade sur un nœud

Confirmer que le nœud est prêt pour la maintenance et appliquer, si nécessaire, la procédure Swarm d'évacuation des charges. Réaliser toutes les étapes suivantes sur un seul nœud à la fois.

Installer le paquet validé :

```bash
sudo apt install /tmp/docker.io_27.5.1-0ubuntu3_amd64.deb
```

Adapter le chemin au nom réel du paquet vérifié. APT peut demander confirmation ou signaler des dépendances; lire le plan d'installation avant de l'accepter.

Vérifier la version et l'état Docker sur le nœud :

```bash
docker --version
dpkg -l 'docker.io'
```

Depuis un manager Swarm, vérifier que le nœud est de nouveau sain et que les services attendus fonctionnent :

```bash
docker node ls
docker service ls
```

Ne passer au nœud suivant qu'après validation du nœud courant et de l'état du cluster. Répéter la procédure nœud par nœud.
